import re
import os
UP=100;username="";userpwd="";   #声明全局变量

def ifexist():  #初始化环境
    e = os.path.exists("user.txt")  # 判断保存用户信息文档是否存在
    global UP, username, userpwd  # 声明使用的是全局变量
    if e == False:  # 不存在，则先进行创建，并填入行标题
        fp = open("user.txt", "w", encoding="utf-8");
        fp.write("用户名" + '\t' + "用户密码" + '\t' + str(10000) + '\n');
        fp.close();

def USER_INFO():   #得到已经有的用户名和用户密码,用户余额
    ifexist();
    NAME = [];  # 保存用户名，用来注册时验证
    PWD=[];     # 保存用户密码，用来登录时验证
    YE=[];     # 保存用户余额
    USER=[];
    fp = open("user.txt", "r", encoding="utf-8")
    for line in fp:
        a = re.split("[\t]", line);  # 对字符串进行分
        uname = a[0]; NAME.append(uname);
        upwd = a[1]; PWD.append(upwd);
        uye=eval(a[2]);YE.append(uye);
        user=[uname,upwd,uye];USER.append(user);
    fp.close();
    return [USER,NAME]

def reg():    #注册功能
    global UP,userpwd,username;
    NAME=USER_INFO()[1];
    username=input("现在开始注册，请输入用户名");
    while username == "":
        username=input("用户名不能为空,重新输入：");
    while username in NAME:
        username=input("用户{}已经存在，请重新输入".format(username));
    pd1 = input("请输入密码：");
    pd2 = input("请确认密码：");
    while pd1 != pd2:  # 进行注册验证
        pd1 = input("注册前后密码不一致，请输入密码：");
        pd2 = input("注册前后密码不一致，请确认密码：");
    # 将注册的用户信息写入user.txt（用户名，用户密码，用户余额）文本中
    f = open("user.txt", "a+", encoding="utf-8")
    f.write(username + '\t' + pd1 + '\t' + str(UP) + '\n');
    f.close();
    userpwd=input("用户{}注册成功，请输入登录密码进行登录(仅有5次机会)：".format(username));
    y=1;
    while userpwd != pd1:
        userpwd = input("密码错误！请重新输入登录密码，剩余{}次机会：".format(5-y));
        y+=1;
        if y==5:
            print("很遗憾，强制退出系统！")
            exit
    shopping();   #直接进入购物系统

def login():  #登录功能
    global UP,username,userpwd   #声明使用的是全局变量
    username = input("请输入用户名：");    # 如果没有该用户，直接让其进行注册，将其信息保存在文本里，如果有，则进行登录
    USER= USER_INFO()[0];
    while username == "":
        username = input("用户名不能为空,重新输入：");
    for user in USER:
        if username in user:
            pwd=user[1];
            userpwd=input("请确认密码：");
            yc=1;
            while userpwd!=pwd:
                userpwd=input("密码错误！请重新输入登录密码，剩余{}次机会：".format(5 - yc));
                yc += 1;
                if yc == 5:
                    print("很遗憾，强制退出系统！")
                    exit
            shopping();
    else:
        ans=input("用户{}不存在,重新登陆[login]/退出系统[exit]/注册[reg]？".format(username))
        aq(ans);

def shopping():   #购物功能
    global UP, BuyGoods;
    ans = input("尊敬的{}，欢迎您进入三乐购物系统！,请输入操作[a(查看商品),b(切换账号),c(选择商品)，exit(退出)]".format(username));
    while ans not in ["a","b","c","exit"]:
        ans = input("输入有误，请输入想进行的操作[a(查看商品),b(切换账号),c(选择商品)，exit(退出)]");
    while ans != "exit":
        if ans == "a":
            lookgoods();
            ans = input("操作完成，继续操作[a(查看商品),b(切换账号),c(选择商品)，exit(退出)]")
        elif ans=="b":
            login();
        else:
            buy();
    exit(-1);


#得到商品的信息，以[商品编号，商品名称，商品价格]返回数组
def lgood():
    goodsid = list(goods.keys());# 得到商品的编号
    Goods = list(goods.values());  # 得到商品的信息
    GOODS=[];
    for i in range(len(Goods)):
        goods_id=goodsid[i]
        goods_name=Goods[i].get('name');
        goods_price=eval(Goods[i].get('price'));
        goods_info=[goods_id,goods_name,goods_price];
        GOODS.append(goods_info);
    return GOODS

#显示商品信息
def lookgoods():
    good=lgood();
    print("商品编号"+'\t'+"商品名称"+'\t'+"商品价格");
    for j in range(len(good)): #设置显示的格式
        print("{}".format(good[j][0])+'\t    '+"{}".format(good[j][1])+'\t      '+"{}".format(good[j][2]));
# 进行下单操作，并返回下单商品表

def xiadan():
    #global xiadan_Goods;
    good = lgood(); #得到商品信息
    xiadan_Goods=[];#开始下单
    s=0;#本次下单预计金额
    for i in range(len(good)):
        num = eval(input("请输入购买编号为{}，名称为{}的数量:".format(good[i][0],good[i][1])));
        xiadan_info=[good[i][0],good[i][1],num,num*good[i][2]]   #下单商品信息
        xiadan_Goods.append(xiadan_info);
    return xiadan_Goods

def buy():
    global UP,username,userpwd;
    xiadan_Goods=xiadan();
    Sum = 0;  # 计算本次购买的金额
    for i in range(len(xiadan_Goods)):
        Sum += xiadan_Goods[i][3];
    while Sum <= UP:
        ans=input("余额足够，请输入你接下来的操作[gm(购买),ck(查看已选),redo(重新选择),exit(退出系统)]：");
        while ans not in ["gm","ck","exit","redo"]:
            ans = input("输入有误，请输入想进行的操作[gm(购买),ck(查看已选),redo(重新选择),exit(退出系统)]");
        if ans == "gm":
            UP = UP - Sum;
            modUP(UP);  # 修改用户文档中的余额
            print_goods(xiadan_Goods);  # 打印本次购买信息
            print("购买成功！本次花费{}，余额为{}".format(Sum, UP));
        elif ans=="ck":
            print_goods(xiadan_Goods);
        elif ans=="redo":
            buy();
        else :
            exit(-1);
    bg=input("余额不够[退出（exit）,重新选择(redo)]:")
    while bg not in ["exit","redo"]:
        bg=input("输入有误，请输入操作[退出（exit）,重新选择(redo)]:");
    if bg == "exit":
        exit(-1);
    else:
        buy();
    exit(-1);

def print_goods(xiadan_Goods): #打印下单信息
    print("商品编号" + '\t' + "商品名称" + '\t' + "下单数量" + '\t' + "商品总价");
    for j in range(len(xiadan_Goods)):  # 设置显示的格式
        if xiadan_Goods[j][3] == 0:  # 不打印没有下单的商品
            continue;
        print("{}".format(xiadan_Goods[j][0]) + '\t    ' + "{}".format(xiadan_Goods[j][1]) + '\t      ' + "{}".format(            xiadan_Goods[j][2]) + '\t      ' + "{}".format(xiadan_Goods[j][3]));

def modUP(ye):  #修改用户文档中的余额
    global username,userpwd,UP
    with open("user.txt", "r", encoding="utf-8") as fp:
        lines=fp.readlines()
        with open("uset.txt","w",encoding="utf-8") as f:
            for line in lines:
                if username in line:
                    line=username + "\t" + userpwd + "\t" + str(ye) + '\n';
                f.write(line)

def aq(ans):
    while ans not in ["login","reg","exit"]:
        ans = input("输入有误，请输入想进行的操作[login(登录),reg(注册),exit(退出)]");
    if ans == "login":
        login();
    elif ans=="reg":
        reg();
    else :
        exit(-1);

def main():
    ans=input("欢迎浏览三乐购物系统，请输入您想要进行的操作[login(登录),reg(注册并登录),exit(退出)]");
    aq(ans)

goods={'F00001':{'name':'苹果','price':'1.2'},'F00002':{'name':'香蕉','price':'5.5'},'F00003':{'name':'橙子','price':'4.5'}};#用user.txt（用户名，用户密码，用户余额）保存用户信息#判断user.txt文件是否存在，如果不存在，则先创建性写入行标题
main()
